from peewee import (BigAutoField,
                    CharField,
                    TextField,
                    IntegerField,
                    DateTimeField,
                    DecimalField,
                    FloatField,
                    BigIntegerField,
                    BooleanField,
                    SmallIntegerField
                    )

from common.model.abstrct import AbstractModel, IntEnumField, AbstractModelWithID
from enums.coupon_enum import CouponTypeEnum, CouponStatusEnum, CouponLimitTypeEnum, CouponCodeStatusEnum


class MallCoupon(AbstractModel):

    class Meta:
        table_name = "tb_mall_coupon"
        indexes = (
            (("mall_id", ), False),
        )

    mall_id = BigIntegerField(help_text="商城id")
    coupon_id = BigAutoField(primary_key=True, help_text="优惠券id")
    outer_coupon_id = CharField(max_length=64, help_text="外部优惠券id", null=True)
    coupon_name = CharField(max_length=32, help_text="优惠券名称")
    coupon_title = CharField(max_length=16, help_text="优惠券title", null=True)
    coupon_description = TextField(help_text="优惠券描述", null=True)

    coupon_type = IntEnumField(help_text="优惠券类型", choices=CouponTypeEnum)
    quantity = IntegerField(help_text="优惠券发放数量")
    start_receive_datetime = DateTimeField(help_text="优惠券可以领取的开始时间")
    end_receive_datetime = DateTimeField(help_text="优惠券可以领取的结束时间")
    start_datetime = DateTimeField(help_text="优惠券可以使用的开始时间")
    end_datetime = DateTimeField(help_text="优惠券可以使用的结束时间")
    # todo 设置领取后多久才可以使用
    # todo 设置领取后多久过期

    status = IntEnumField(help_text="优惠券状态", choices=CouponStatusEnum)

    amount = DecimalField(help_text="满减券 最少金额", null=True)
    fee = DecimalField(help_text="满减 减免金额", null=True)
    discount = FloatField(help_text="折扣 1表示一折 9表示九折", null=True)

    can_use_with_other_coupon = BooleanField(default=False, help_text="是否可以和其他优惠券一起使用")
    can_use_with_promo = BooleanField(default=False, help_text="是否可以和促销一起使用")


# 优惠券领取限制表
class CouponReceiveLimit(AbstractModelWithID):

    class Meta:
        table_name = "tb_mall_coupon_limit"
        indexes = (
            (("coupon_id", ), True),
        )
    coupon_id = BigIntegerField()
    # 总张数限制：表示每个人只能领取n张, 可以是连续领取，也可以不连续
    # 领取时间限制：表示每隔多久才允许领取一张，但是没有领取张数的限制
    # 总张数和领取时间限制： 表示每个人总共可以领取n张，并且每次领取的间隔时间必须间隔一定的时间单位
    limit_type = IntEnumField(help_text="领取限制类型,总张数限制/领取时间限制/总张数和领取时间间隔一起限制",
                              choices=CouponLimitTypeEnum)
    # 大小 1-10
    interval = SmallIntegerField(default=1, help_text="领取间隔")
    # 这简单点， 就是简单比较当前时间往前推时间间隔没有领取就行，
    # 暂时不做精细的比较 ，比如一天是指0点结束 也就是23。59可以领取 然后00：01又可以领取 一周是从周一开始之类的
    unit = CharField(default="day", help_text="领取间隔单位: day week mouth year")


class MiddleCouponSPU(AbstractModelWithID):

    class Meta:
        table_name = "tb_middle_coupon_spu"
        indexes = (
            (("mall_id", "spu_id"), False),  # 这个可以查spu有什么优惠券
            (("coupon_id", ), False)  # 这个可以查coupon绑定了多少spu
        )
    mall_id = BigIntegerField(help_text="mall_id")
    spu_id = BigIntegerField(help_text="spu id")
    coupon_id = BigIntegerField(help_text="coupon_id")


class CouponCode(AbstractModel):

    class Meta:
        table_name = "tb_mall_coupon_code"
        indexes = (
            (("coupon_id", "coupon_code"), True),
        )
    coupon_id = BigIntegerField(help_text="coupon id")
    coupon_code = CharField(max_length=16, help_text="优惠券券码")
    user_id = BigIntegerField(help_text="用户id,如果已经领取，则这个字段存在", null=True)
    status = IntEnumField(help_text="优惠券code的状态", choices=CouponCodeStatusEnum)




